﻿using System;
using System.IO;
using System.Linq;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Formatting;

namespace PrintTime
{
    internal class Program
    {
        static void Main(string[] args)
        {
            // 解决方案根目录
            string solutionPath = @"F:\Work-Git\WCS2.1 - 测试时间打印\MainControl\Control\新建文件夹"; // 替换为您的文件路径

            // 遍历解决方案中的所有 .cs 文件
            var csFiles = Directory.GetFiles(solutionPath, "*.cs", SearchOption.AllDirectories);

            foreach (var filePath in csFiles)
            {
                try
                {
                    // 读取文件内容
                    string code = File.ReadAllText(filePath);

                    // 解析语法树
                    SyntaxTree tree = CSharpSyntaxTree.ParseText(code);
                    var root = tree.GetRoot();

                    // 使用 SyntaxRewriter 修改语法树
                    var rewriter = new TimeAttributeRewriter();
                    var newRoot = rewriter.Visit(root);

                    // 格式化代码
                    var workspace = new AdhocWorkspace();
                    var formattedRoot = Formatter.Format(newRoot, workspace);

                    // 保存修改后的文件
                    File.WriteAllText(filePath, formattedRoot.ToFullString());

                    Console.WriteLine($"[Time] 特性已成功添加到文件: {filePath}");
                }
                catch (Exception ex)
                {
                    Console.WriteLine($"处理文件时出错: {filePath}, 错误: {ex.Message}");
                }
            }

            Console.WriteLine("所有文件处理完成！");
        }
    }

    // 自定义 SyntaxRewriter，用于添加 [Time] 特性
    class TimeAttributeRewriter : CSharpSyntaxRewriter
    {
        public override SyntaxNode VisitMethodDeclaration(MethodDeclarationSyntax node)
        {
            // 跳过已经包含 [Time] 特性的方法
            if (node.AttributeLists.Any(al => al.Attributes.Any(a => a.Name.ToString() == "Time")))
            {
                return base.VisitMethodDeclaration(node);
            }

            // 创建 [Time] 特性
            var attribute = SyntaxFactory.Attribute(SyntaxFactory.IdentifierName("Time"));
            var attributeList = SyntaxFactory.AttributeList(
                SyntaxFactory.SingletonSeparatedList(attribute)
            );

            // 将 [Time] 特性添加到方法上方
            var newMethod = node.WithAttributeLists(
                SyntaxFactory.List(new[] { attributeList }.Concat(node.AttributeLists))
            );

            return base.VisitMethodDeclaration(newMethod);
        }

        // 忽略预处理指令（如 #region 和 #endregion）
        public override SyntaxTrivia VisitTrivia(SyntaxTrivia trivia)
        {
            if (trivia.IsKind(SyntaxKind.RegionDirectiveTrivia) || trivia.IsKind(SyntaxKind.EndRegionDirectiveTrivia))
            {
                return trivia; // 保持原样，不处理
            }
            return base.VisitTrivia(trivia);
        }
    }
}